package com.bonshotels.DataLayer.CtrlDadesHibernate;

import java.util.Collection;
import java.util.HashSet;
import java.util.Set;

import org.hibernate.Query;
import com.bonshotels.DomainLayer.CtrlDades.ICtrlHabitacio;
import com.bonshotels.DomainLayer.DomainModel.Habitacio;
import com.bonshotels.Excepcions.HabitacioNoExisteix;

/**
 * Aquesta classe es la implementacio concreta per a Hibernate de ICtrlChabitacio, es un producte
 * concret dins del patro factoria abstracta.
 * @autor Marc Mauri Alloza
 */
class CtrlHabitacioHibernate extends CtrlGeneralHibernate implements ICtrlHabitacio {

	/* (non-Javadoc)
	 * @see com.bonshotels.DomainLayer.CtrlDades.ICtrlHabitacio#obte(int, java.lang.String)
	 */
	@Override
	public Habitacio obte(int numHabitacio, String hotel) throws HabitacioNoExisteix {
		Query query = getSession().createQuery("from Habitacio where numero = :numHabitacio and nomHotel = :hotel");
		query.setParameter("numHabitacio", numHabitacio);
		query.setParameter("hotel", hotel);
		if (query.list().isEmpty() ) throw new HabitacioNoExisteix();
		return (Habitacio) query.list().get(0);
	}

	/* (non-Javadoc)
	 * @see com.bonshotels.DomainLayer.CtrlDades.ICtrlHabitacio#existeix(int, java.lang.String)
	 */
	@Override
	public boolean existeix(int numHabitacio, String hotel) {
		Query query = getSession().createQuery("select * from Habitacio where num = :numHabitacio and nomHotel = :hotel");
		query.setParameter("numHabitacio", numHabitacio);
		query.setParameter("hotel", hotel);
		return query.list().size() == 1;
	}

	/* (non-Javadoc)
	 * @see com.bonshotels.DomainLayer.CtrlDades.ICtrlHabitacio#obteTots()
	 */
	@Override
	public Set<Habitacio> obteTots() {
		Collection<Habitacio> habs = getSession().createCriteria(Habitacio.class).list();
		return new HashSet<Habitacio>(habs);
	}

}
